import os


# 给予一个目录(可能存在子目录)把这个目录中所有.py文件拷贝到另外一个指定目录中
def copy_dir(source_dir, destination_dir):
    """
    拷贝source_dir目录中所有的py文件夹，到另外一个目录destination_dir中
    :param source_dir:原始目录
    :param destination_dir:目标目录
    :return: 返回一共拷贝的文件
    """
    count = 0  # 文件数量
    for f in os.listdir(source_dir):  # f代表目录下的每一个文件 包括目录
        # 把文件名和目录拼凑一个完整的绝对路劲
        f_path = os.path.join(source_dir, f)
        if os.path.isfile(f_path) and f.endswith('.py'):  # 表示f是一个普通文件 并且也是py文件
            # 拷贝该文件
            if not os.path.exists(destination_dir):  # 目标目录不存在
                # 创建目录
                os.makedirs(destination_dir)
            # 拼凑一个拷贝之后的绝对路劲
            sink_path = os.path.join(destination_dir, f)
            # 拷贝文件内容到sink_path中
            num = copy_file(f_path, sink_path)
            count += num
        elif os.path.isdir(f_path):  # f 是一个目录
            # 采用递归函数
            # 为了保持同样的目录结果，目标目录要改变
            new_destination_path = os.path.join(destination_dir, f)
            copy_dir(f_path, new_destination_path)
    return count


def copy_file(source_file, sink_file):
    """
    拷贝单个文件，把source_file文件内容拷贝到 sink_file中
    :param source_file:原始文件的绝对路径
    :param sink_file:目标文件的绝对路径
    :return: 拷贝成功返回1
    """
    # 第一种考虑到文件都是小文件，可以一次性读取全部文件内容并且一次性写入新文件
    # with open(source_file, mode='r', encoding='gbk') as source_f:
    #     content = source_f.read()
    #     with open(sink_file, mode='w', encoding='gbk') as sink_f:
    #         sink_f.write(content)
    # return 1
    # 第二种 考虑大文件 每次从源文件读取一部分，并且写入到新文件中（循环多次）
    source_f = open(source_file, mode='r', encoding='gbk')
    sink_f = open(sink_file, mode='w', encoding='gbk')
    while True:
        content = source_f.read(1024 * 10)  # 每次读取10kb
        if content == '' or content is None:  # 没有读取到数据
            break  # 意味着文件读完
        sink_f.write(content)
    source_f.close()
    sink_f.close()
    return 1


copy_dir(r'D:\zhanghd\workingFile\studyCalendar\python\20250521\test1', r'D:\test2')
